package com.liang.drug.aop;

import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
import org.springframework.stereotype.Component;

/**
 * @Author: ljy
 * @Date:2022/1/4 21:07
 */
@Aspect//标注这是一个切面
@Component
public class AopAdvice {
    /**
     * *1、代表返回任意类型
     * *2、代表任意类
     * *3、代表任意方法
     * （。。）代表任意参数
     * excution 在方法执行时触发
     */
    @Pointcut("execution (* com.liang.drug.controller.*.*(..))")
    public void test() {

    }

    //前置通知
    @Before("test()")
    /**
     * 通过JoinPoint get拿到参数进行处理
     */
    public void beforeAdvice(JoinPoint joinPoint) {
        System.out.println("beforeAdvice...");
        Object[] args = joinPoint.getArgs();
        for (Object arg : args) {
            System.out.println(arg);
        }
    }

    //后置通知
    @After("test()")
    public void afterAdvice() {
        System.out.println("afterAdvice...");
    }

    //在被通知的方法调用之前和调用之后执行自定义的方法
//    @Around("test()")
//    public void aroundAdvice(ProceedingJoinPoint proceedingJoinPoint) {
//        System.out.println("before");
//        try {
//            proceedingJoinPoint.proceed();
//        } catch (Throwable t) {
//            t.printStackTrace();
//        }
//        System.out.println("after");
//    }
}
